package Day_0131.JVM;

/**
 * @author zxc
 * @date 2023/01/31 21:52
 **/
public class Pointer_Collision {
    public static void main(String[] args) {
        /**
         * 指针碰撞 ：（即，给Java对象分配内存的一种方法）
         * ===》 即，在Java堆中内存是绝对规整的情况下，使用Pointer指针去区分使用过的内存 && 未使用过的内存;
         *
         * 一般情况下，JVM的对象都放在堆内存中（发生逃逸分析除外）。
         * （1）类加载检查通过后，Java虚拟机开始为新生对象分配内存。
         * （2）如果Java堆中内存是绝对规整的，所有被使用过的的内存都被放到一边，空闲的内存放到另外一边，中间放着一个指针作为分界点的指示器，
         *  分配内存,就是把那个指针向空闲空间方向挪动一段与对象大小相等的实例，
         *  ===》 这种分配方式就是 指针碰撞
         */

        /**
         * 空闲列表 ：（即，给Java对象分配内存的一种方法）
         * ===》 即，当Java堆内存不规整时，JVM会维护一个列表，用来记录已经使用/未使用的内存;
         *
         * （1）如果Java堆内存中的内存并不是规整的，已被使用的内存和空闲的内存相互交错在一起，不可以使用指针碰撞来为对象分配内存;
         * （2）虚拟机必须维护一个列表，记录哪些内存是可用的，在分配的时候从列表找到一块大的空间分配给对象实例，并更新列表上的记录;
         *  ===》这种分配方式就是空闲列表。
         */

        /**
         * TLAB ：（Thread Local Allocation Buffer 本地线程分配缓存）
         * （即，每个线程都预先在Java堆中预先获取一块内存）
         * 把内存分配的动作按照线程划分在不同的空间之中进行，每个线程在Java堆中预先分配一小块内存,
         * 虚拟机通过 -XX:UseTLAB 设定它的。
         */
    }
}
